package org.ejb.stateless;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Logger;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.ejb.api.ProduitInterface;
import org.ejb.entities.Annonce;
import org.ejb.entities.Evaluation;
import org.ejb.entities.Item;
import org.ejb.entities.Produit;
import org.ejb.entities.Utilisateur;
import org.ejb.entities.ValidationException;

@SuppressWarnings(value = "unchecked")
@TransactionAttribute(value = TransactionAttributeType.REQUIRED)
@Stateless(mappedName = "org.ejb.stateless.ProduitStateless@Remote", description = "Produit stateless", name = "ProduitStateless")
public class ProduitStateless implements ProduitInterface{
	@PersistenceContext
    private EntityManager em;

    private final String cname = this.getClass().getName();
    private Logger logger = Logger.getLogger("org.ejb.stateless");
    
    public Produit createProduit(Produit produit) {
        final String mname = "createProduit";
        logger.entering(cname, mname, produit);

        // On s'assure de la validite des paramatres
        if (produit == null) throw new ValidationException("Produit object is null");
        
        // On modifie l'objet de la base de donnees
        em.persist(produit);
        em.flush();

        logger.exiting(cname, mname, produit);
        return produit;
    }
    
//    public Item createItem(Item item) {
//        final String mname = "createitem";
//        logger.entering(cname, mname, item);
//
//        // On s'assure de la validite des paramatres
//        if (item == null) throw new ValidationException("Produit object is null");
//
//        //produit.setItems(items);
//        
//        // On modifie l'objet de la base de donnees
//        em.persist(item);
//        em.flush();
//
//        logger.exiting(cname, mname, item);
//        return item;
//    }
    
	public void ajouteItem(Produit produit ,Item item){
		final String mname = "ajouterAnnonce";
        logger.entering(cname, mname, produit);
        
        // On s'assure de la validite des paramatres
        if (produit == null) throw new ValidationException("Produit object is null");
        if (item == null) throw new ValidationException("Item object is null");
        
        item.setProduit(produit);
        em.persist(item);
        em.flush();
        
        logger.exiting(cname, mname, produit);
	}
    
    public Produit findProduit(Long produitid) {
        final String mname = "findProduit";
        logger.entering(cname, mname, produitid);

        // On s'assure de la validite des paramatres
        if (produitid == null) throw new ValidationException("Invalid id");

        Produit produit;

        // On recherche l'objet a partir de son identifiant
        produit = em.find(Produit.class, produitid);

        logger.exiting(cname, mname, produit);
        return produit;
    }
    
    public Item findItem(Long itemid) {
        final String mname = "findItem";
        logger.entering(cname, mname, itemid);

        // On s'assure de la validite des paramatres
        if (itemid == null) throw new ValidationException("Invalid id");

        Item item;

        // On recherche l'objet a partir de son identifiant
        item = em.find(Item.class, itemid);

        logger.exiting(cname, mname, itemid);
        return item;
    }
    
//	public List<Item> searchItems(final String keyword) {
//	    final String mname = "searchItems";
//	    logger.entering(cname, mname, keyword);
//	
//	    Query query;
//	    List<Item> items;
//	
//	    // On modifie l'objet de la base de donnees
//	    query = em.createQuery("SELECT i FROM Item i WHERE UPPER(i.name) LIKE :keyword OR UPPER(i.product.name) LIKE :keyword ORDER BY i.product.name");
//	    query.setParameter("keyword", "%" + keyword.toUpperCase() + "%");
//	    items = query.getResultList();
//	
//	    logger.exiting(cname, mname, items.size());
//	    return items;
//	    }


    public void deleteProduit(Produit produit) {
        final String mname = "deleteProduit";
        logger.entering(cname, mname, produit);

        // On s'assure de la validite des paramatres
        if (produit == null)
            throw new ValidationException("Produit object is null");

        // On supprime l'objet de la base de donnees
        em.remove(em.merge(produit));

        logger.exiting(cname, mname);
    }
    
    public void deleteItem(Item item) {
	    final String mname = "deleteItem";
	    logger.entering(cname, mname, item);
	
	    // On s'assure de la validite des paramatres
	    if (item == null)
	        throw new ValidationException("Item object is null");
	
	    // On supprime l'objet de la base de donnees
	    em.remove(em.merge(item));
	
	    logger.exiting(cname, mname);
}
    
    
    public List<Item> findItems() {
    	final String mname = "findItems";
    	logger.entering(cname, mname);

    	Query query;
    	List<Item> item;

    	// On modifie l'objet de la base de donnees
    	query = em.createQuery("SELECT c FROM Item c");
    	item = query.getResultList();

    	logger.exiting(cname, mname, item.size());
    	return item;
}
    
    public List<Item> findItems(String keyword) {
    	final String mname = "findItems";
    	logger.entering(cname, mname);

    	Query query;
    	List<Item> item;

    	// On modifie l'objet de la base de donnees
    	query = em.createQuery("SELECT i FROM Item i WHERE UPPER(i.name) LIKE" + keyword);
    	query.setParameter("keyword", "%" + keyword.toUpperCase() + "%");
    	item = query.getResultList();

    	logger.exiting(cname, mname, item.size());
    	return item;
    }
    
    public List<Item> findItemsByConsole(String console) {
    	final String mname = "findItems";
    	logger.entering(cname, mname);

    	Query query;
    	List<Item> item;

    	// On modifie l'objet de la base de donnees
    	query = em.createQuery("SELECT c FROM Item c WHERE c.console="+ console);
    	item = query.getResultList();

    	logger.exiting(cname, mname, item.size());
    	return item;
    }
    
    public List<Item> findItemsByGenre(String genre) {
    	final String mname = "findItems";
    	logger.entering(cname, mname);

    	Query query;
    	List<Item> item;
    	// On modifie l'objet de la base de donnees
    	query = em.createQuery("SELECT c FROM Item c WHERE c.genre="+ genre);
    	item = query.getResultList();

    	logger.exiting(cname, mname, item.size());
    	return item;
    }

    public Produit updateProduit(Produit produit, String description) {
        final String mname = "updateProduit";
        logger.entering(cname, mname, produit);

        // On s'assure de la validite des paramatres
        if (produit == null)
            throw new ValidationException("Produit object is null");

        produit.setDescription(description);
        
        // On modifie l'objet de la base de donnees
        em.merge(produit);

        logger.exiting(cname, mname, produit);
        return produit;
    }
    
    public void updateItem(Item item){
    	 final String mname = "updateItem";
         logger.entering(cname, mname, item);

         // On s'assure de la validite des paramatres
         if (item == null)
             throw new ValidationException("Item object is null");
         
         // On modifie l'objet de la base de donnees
         em.merge(item);

         logger.exiting(cname, mname, item);
    }
    
//    public Item updateItem(final Item item, final String description, final String name, final Set<Evaluation> evals, final float evaluation, final String imagePath, final Produit product, final int soldQuantity, final Float unitCost) {
//	    final String mname = "updateItem";
//	    logger.entering(cname, mname, item);
//	
//	    // On s'assure de la validite des paramatres
//	    if (item == null)
//	        throw new ValidationException("Item object is null");
//	
//	 //   item.setDescription(description);
//	    item.setName(name);
//	//    item.setEvals(evals);
//	//    item.setEvaluation(evaluation);
////	    item.setImagePath(imagePath);
////	    item.setProduit(product);
////	    item.setSoldQuantity(soldQuantity);
////	    item.setUnitCost(unitCost);
//	
//	    // On modifie l'objet de la base de donnees
//	    em.merge(item);
//	
//	    logger.exiting(cname, mname, item);
//	    return item;
//}
    
    
    
    // fonction evaluation
//	public Evaluation createEvaluation(Evaluation evaluation){
//		  final String mname = "createEvaluation";
//	        logger.entering(cname, mname, evaluation);
//
//	        // On s'assure de la validite des paramatres
//	        if (evaluation == null) throw new ValidationException("Evaluation object is null");
//
//	        //produit.setItems(items);
//	        
//	        // On modifie l'objet de la base de donnees
//	        em.persist(evaluation);
//	        em.flush();
//
//	        logger.exiting(cname, mname, evaluation);
//		return evaluation;	
//	}
	
	public void ajouteEvaluation(Item item, Evaluation evaluation){
		final String mname = "ajouterEvaluation";
        logger.entering(cname, mname, evaluation);
        
        // On s'assure de la validite des paramatres
        if (item == null) throw new ValidationException("Item object is null");
        if (evaluation == null) throw new ValidationException("Evaluation object is null");
        
        evaluation.setItem(item);
        em.persist(evaluation);
        em.flush();
        
        logger.exiting(cname, mname, evaluation);
	}
	
	
//	public List<Item> rechercheArticles(String genred, String consoled){
//		 
//		  logger.info("Entree dans la classe : " + getClass().getName());
//		  logger.info("Entree dans la methode : rechercheArticles()");		  
//		  Query query = null;
//		  		  
//		  if ((genred.equals("Tous") && consoled.equals("Tous")) || (genred.equals("") && consoled.equals(""))){			  
//			   query = em.createQuery("SELECT OBJECT(i) FROM item i");
//		  } 
//		  else if (genred.equals("Tous") ){			  
//			  query = em.createQuery("SELECT OBJECT(i) FROM item i WHERE i.console=:consoled");
//				query.setParameter("consoled", consoled);
//		  }
//		  else if (consoled.equals("Tous") ){			  
//			  query = em.createQuery("SELECT OBJECT(i) FROM item i WHERE i.genre=:genred");
//				query.setParameter("genred", genred);
//		  }
//		  else{			  
//			  query = em.createQuery("SELECT OBJECT(i) FROM item i WHERE i.genre:=genred and i.console:=consoled");
//				query.setParameter("genred", genred);
//				query.setParameter("consoled", consoled);
//		  }
//		
//		List<Item> articles = query.getResultList();		
//		return articles;
//	}
	
	public List<Item> rechercheArticles(String genred, String consoled){
		 
		  logger.info("Entree dans la classe : " + getClass().getName());
		  logger.info("Entree dans la methode : rechercheArticles "+ genred + "  deuxime para " + consoled);		  
		  Query query = null;
		  List<Item> articles = new ArrayList<Item>();
		 		  
          //query = em.createQuery("SELECT i FROM Item AS i WHERE i.genre='"+genred+"'");
		  if (genred.equals("Tous") && consoled.equals("Tous")){			  
			   query = em.createQuery("SELECT i FROM Item AS i"); //j'ai ajoute AS i
			   //logger.info("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
		  } 
		  else if (genred.equals("Tous") && !consoled.equals("Tous") ){
			  query = em.createQuery("SELECT i FROM Item AS i WHERE console='"+consoled+"'");
			  //logger.info("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
			  //query.setParameter("consoled", consoled);
		  }
		  else if (consoled.equals("Tous") && !genred.equals("Tous")){			  
			  query = em.createQuery("SELECT i FROM Item AS i WHERE genre='"+genred+"'");
			  //logger.info("cccccccccccccccccccccccccccccccccccccccccccccccccccccc");
			  //query.setParameter("genred", genred);
		  }
		  else{			  
			  query = em.createQuery("SELECT i FROM Item AS i WHERE genre='"+genred+"' and console='"+consoled+"'");
			  //logger.info("dddddddddddddddddddddddddddddddddddddddddd");
		  }
		
		articles = query.getResultList();		
		return articles;
	}
	
	
	
	
	// Recherche d'articles par nom.
	// Exemple : P ==> renvoie tous les articles commendant par P
	public List<Item> rechercheArticleParNom(String nomArticle){
		
		  logger.info("Entree dans la classe : " + getClass().getName());
		  logger.info("Entree dans la methode : rechercheArticleParNom()");		  
		  Query query = null;
		  List<Item> articles = new ArrayList<Item>();
		  query = em.createQuery("SELECT OBJECT(i) FROM item i WHERE i.name like "+nomArticle+"%");
			//query.setParameter("name", nomArticle+"%");
//			query.setParameter("consoled", consoled);
		  
		 // query.setParameter(1, nomArticle + "%");
			
		 articles = query.getResultList();
//		
//		Iterator<Item> e = articles.iterator();
//		while (e.hasNext()){
//			  logger.info("******************************************************** ");		  
//			  logger.info("Entree dans la methode : rechercheArticles "+ e.toString());		  
//		}
		return articles;
	}

}
